﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Entities;
using Business;
using DevComponents.DotNetBar;
namespace Presentation
{
    public partial class frmQuanLyTheLoai : DevComponents.DotNetBar.Office2007Form
    {
        bool save;
        public frmQuanLyTheLoai()
        {
            InitializeComponent();
        }
        DataTable dt = new DataTable();
        DataView dv = new DataView();        
        private void frmQuanLyTheLoai_Load(object sender, EventArgs e)
        {
            LoadGridView();
            save = false;
        }

        private void txtTimKiem_KeyPress(object sender, KeyPressEventArgs e)
        {
         //   MessageBox.Show((char.IsPunctuation(e.KeyChar)).ToString());

            if (char.IsPunctuation(e.KeyChar))
            {
                e.Handled = true;                
            }
           
            
        }

        private void btnCapNhat_Click(object sender, EventArgs e)
        {

           if(CapNhat())
               MessageBoxEx.Show("Đã cập nhật dữ liệu!","Thông báo!",MessageBoxButtons.OK,MessageBoxIcon.Information);
           else
               MessageBoxEx.Show("Không thể cập nhật dữ liệu!", "Thông báo!", MessageBoxButtons.OK, MessageBoxIcon.Error);

        }

        private void txtTimKiem_TextChanged(object sender, EventArgs e)
        {
            dv.RowFilter = "TenTheLoai like '%" + txtTimKiem.Text + "%'";
            dgvTheLoai.DataSource = dv;
            if (txtTimKiem.Text == "")
            {
                //dv.RowStateFilter = DataViewRowState.OriginalRows;
                dgvTheLoai.DataSource = dt;
            }
        }

       
        private bool CapNhat()
        {
            dv.RowStateFilter = DataViewRowState.Added;
            DataTable dtThem = dv.ToTable();

            dv.RowStateFilter = DataViewRowState.ModifiedCurrent;
            DataTable dtCapNhat = dv.ToTable();

            dv.RowStateFilter = DataViewRowState.Deleted;
            DataTable dtXoa = dv.ToTable();
            bool kq = false;

            #region //Kiểm tra các dòng xem có ô nào rỗng không nếu có thì return false
            List<TheLoaiDTO> listThem = new List<TheLoaiDTO>();
            for (int i = 0; i < dtThem.Rows.Count;i++ )
            {
                if (dtThem.Rows[i]["TenTheLoai"].ToString() == "")
                    return false;
                TheLoaiDTO tl = new TheLoaiDTO();
                tl.MaTheLoai = (int)dtThem.Rows[i]["MaTheLoai"];
                tl.TenTheLoai = (string)dtThem.Rows[i]["TenTheLoai"];
                listThem.Add(tl);
            }

            List<int> listXoa = new List<int>();
            for (int i = 0; i < dtXoa.Rows.Count;i++ )
            {
                int ma= (int)dtXoa.Rows[i]["MaTheLoai"];
                listXoa.Add(ma);                
            }

            List<TheLoaiDTO> listCapNhat = new List<TheLoaiDTO>();
            for (int i = 0; i < dtCapNhat.Rows.Count;i++ )
            {
                if (dtCapNhat.Rows[i]["TenTheLoai"].ToString() == "")
                    return false;
                TheLoaiDTO tl = new TheLoaiDTO();
                tl.MaTheLoai = (int)dtCapNhat.Rows[i]["MaTheLoai"];
                tl.TenTheLoai = (string)dtCapNhat.Rows[i]["TenTheLoai"];
                listCapNhat.Add(tl);
                
            }
#endregion
            //Kiểm tra xem có thao tác gì trên lưới ko
            if (listCapNhat.Count == 0 && listThem.Count == 0 && listXoa.Count == 0)
            {
                return false;
            }
            
            foreach (int maTheLoai in listXoa)
            {
                TheLoaiService.Delete(maTheLoai);
            }
            foreach (TheLoaiDTO tl in listThem)
            {
                TheLoaiService.Insert(tl);
            }

            foreach (TheLoaiDTO tl in listCapNhat)
            {
                TheLoaiService.Update(tl);
            }
            save = false;
            btnCapNhat.Enabled = false;
            return true;
            
        }

        private void btnRefresh_Click(object sender, EventArgs e)
        {
           LoadGridView();
           
        }

        private void LoadGridView()
        {
            dgvTheLoai.Columns.Clear();
            dgvTheLoai.AutoGenerateColumns = false;
            dgvTheLoai.Columns.Add("MaTheLoai", "Mã thể loại");
            dgvTheLoai.Columns["MaTheLoai"].DataPropertyName = "MaTheLoai";
            dgvTheLoai.Columns["MaTheLoai"].ReadOnly = true;
            dgvTheLoai.Columns.Add("TenTheLoai", "Tên thể loại");
            dgvTheLoai.Columns["TenTheLoai"].DataPropertyName = "TenTheLoai";

            dt = TheLoaiService.GetTheLoaiTable();
            dt.TableName = "TheLoai";
            dt.AcceptChanges();
            dv.Table = dt;                        
            dgvTheLoai.DataSource = dt;
            btnCapNhat.Enabled = true;
        }

        private void dgvTheLoai_UserAddedRow(object sender, DataGridViewRowEventArgs e)
        {
            int id = GetLastID();
            for (int i = e.Row.Index-1; i < dgvTheLoai.RowCount; i++)
            {
                dgvTheLoai["MaTheLoai", i].Value = id++;
            }
        }

        int GetLastID()
        {
            dv.RowStateFilter = DataViewRowState.Added;
            DataTable dtThem = dv.ToTable();
            
            int id=-1;
            if (dtThem.Rows.Count == 0)
            {
                id = TheLoaiService.GetCurrentID();
                if (TheLoaiService.GetTheLoaiByMaLoai(id) == null)
                    id = 0;
                
            }
            else
            {
                id = (int)dtThem.Rows[dtThem.Rows.Count - 1]["MaTheLoai"];
                
            }            
            return id+1;
        }

        private void dgvTheLoai_UserDeletingRow(object sender, DataGridViewRowCancelEventArgs e)
        {
            int id = int.Parse(dgvTheLoai["MaTheLoai", e.Row.Index].Value.ToString());
            
            if (!TheLoaiService.CheckDelete(id))
            {
                MessageBoxEx.Show("Không thể xóa thể loại này!", "Lỗi", MessageBoxButtons.OK, MessageBoxIcon.Error);
                e.Cancel = true;
            }
            if (id >= TheLoaiService.GetCurrentID())
            {
                for (int i = e.Row.Index + 1; i < dgvTheLoai.RowCount; i++)
                {
                    dgvTheLoai["MaTheLoai", i].Value = id;
                    id++;
                }
                
            }
        }

        private void frmQuanLyTheLoai_FormClosing(object sender, FormClosingEventArgs e)
        {

            if (save)
            {
                DialogResult r = MessageBoxEx.Show("Bạn có muốn lưu các giá trị đã thay đổi không?", "Thông báo!", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question);
                if (r == DialogResult.Cancel)
                {
                    e.Cancel = true;

                }
                else if (r == DialogResult.Yes)
                {
                    if (CapNhat())
                        MessageBoxEx.Show("Đã cập nhật dữ liệu!", "Thông báo!", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    else
                    {
                        MessageBoxEx.Show("Không thể cập nhật dữ liệu!", "Thông báo!", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        e.Cancel = true;
                    }
                }
            }
        }

        private void btnThoat_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void dgvTheLoai_CellValueChanged(object sender, DataGridViewCellEventArgs e)
        {
            save = true;
        }

      

    }
}
